#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time          : 2024/4/26 11:06
# File          : log_util.py
# @Author       : MingTai
# @Department   : automation_qa
import logging.config
import platform

# 日志格式,可用于打印日志
from app.utils.file.file import file_check_and_create

APP_NAME = 'you_app_name'

standard_format = '[you_app_name]-[%(asctime)s]-[%(levelname)s]-[%(threadName)s:%(thread)d]-%(name)s-%(message)s'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s-%(funcName)s:%(lineno)d]%(message)s'
test_format = '%(asctime)s] %(message)s'

# 日志文件名,打印日志的路径，Ubuntu和mac有时候会没权限，需要新建文件夹或者赋值file.py
logfile_name = '/aaa/bbb/ccc/' + APP_NAME
p = platform.platform()
if "Darwin" in p or "macOS" in p:
    logfile_name = "/tmp/log/" + APP_NAME

# 日志配置
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
        'test': {
            'format': test_format
        },
    },
    'filters': {},
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        'common': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': '%s/%s.log' % (logfile_name, APP_NAME),  # 日志文件路径
            'maxBytes': 1024 * 1024 * 100,  # 日志大小 100M
            'backupCount': 10,  # 备份10个日志文件
            'encoding': 'utf-8'  # 日志文件的编码，再也不用担心中文log乱码了
        },
        # 打印到文件的日志,收集info及以上的日志
        'importance': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': '%s/%s_error.log' % (logfile_name, APP_NAME),
            'maxBytes': 1024 * 1024 * 50,
            'backupCount': 10,
            'encoding': 'utf-8'
        }
    },
    'loggers': {
        APP_NAME: {
            'handlers': ['console', 'common', 'importance'],  # 这里把上面定义的两个handler都加上，即log数据既写入文件又打印到屏幕
            'level': 'INFO',  # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
            'propagate': False  # 默认为True，向上（更高level的logger）传递，通常设置为False即可，否则会一份日志向上层层传递，导致重复记录问题
        },
        'console': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False
        },
        '': {
            'handlers': ['common'],
            'level': 'DEBUG',
            'propagate': False
        },
    },
}


class Log(object):
    @staticmethod
    def isdir_logs():
        """
        判断日志文件是否存在，不存在则创建
        :return:
        """
        file_check_and_create(logfile_name)

    @staticmethod
    def make_logger(name=None):
        """
        1. 如果不传name，则根据__name__去loggers里查找__name__对应的logger配置(__name__为调用文件名)
        获取logger对象通过方法logging.getLogger(__name__)，不同的文件__name__不同，这保证了打印日志时标识信息不同，
        2. 如果传name,则根据name获取loggers对象
        3. 如果拿着name或者__name__去loggers里找key名时却发现找不到，于是默认使用key=''的配置
        :return: logger
        """
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
        if name:
            logger = logging.getLogger(name)
        else:
            logger = logging.getLogger(__name__)
        return logger


Log = Log()
Log.isdir_logs()
# 引入日志，只引入这个
# eg: from app.utils.log_util import log
log = Log.make_logger(APP_NAME)
